<!DOCTYPE html>
<html lang="zh">
<head><meta name="generator" content="Hexo 3.9.0">
    <meta charset="utf-8">
<title>Maven到底是什么 - 听到微笑的博客</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">



    <meta name="description" content="Maven 是一个项目管理工具，它最主要的两个功能就是：依赖管理和项目构建。">
<meta name="keywords" content="Maven">
<meta property="og:type" content="article">
<meta property="og:title" content="Maven到底是什么">
<meta property="og:url" content="http://www.tianjindong.cn/article/22321.html">
<meta property="og:site_name" content="听到微笑的博客">
<meta property="og:description" content="Maven 是一个项目管理工具，它最主要的两个功能就是：依赖管理和项目构建。">
<meta property="og:locale" content="zh-CN">
<meta property="og:image" content="http://www.tianjindong.cn/gallery/thumbnails/db1.jpg">
<meta property="og:updated_time" content="2021-01-16T13:57:48.367Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Maven到底是什么">
<meta name="twitter:description" content="Maven 是一个项目管理工具，它最主要的两个功能就是：依赖管理和项目构建。">
<meta name="twitter:image" content="http://www.tianjindong.cn/gallery/thumbnails/db1.jpg">







<link rel="icon" href="/images/favicon.ico">


<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.7.2/css/bulma.css">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.4.1/css/all.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Ubuntu:400,600|Source+Code+Pro">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/highlight.js@9.12.0/styles/atom-one-dark.css">


    
    
    
    <style>body>.footer,body>.navbar,body>.section{opacity:0}</style>
    

    
    
    
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/lightgallery@1.6.8/dist/css/lightgallery.min.css">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/justifiedGallery@3.7.0/dist/css/justifiedGallery.min.css">
    

    
    

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/outdatedbrowser@1.1.5/outdatedbrowser/outdatedbrowser.min.css">


    
    
    
    

<link rel="stylesheet" href="/css/back-to-top.css">


    
    

    
    
<script>
var _hmt = _hmt || [];
(function() {
    var hm = document.createElement("script");
    hm.src = "//hm.baidu.com/hm.js?81f9c1489f84c7a99b0bd377c9fb5de8";
    var s = document.getElementsByTagName("script")[0];
    s.parentNode.insertBefore(hm, s);
})();
</script>

    
    

    
    
<link rel="stylesheet" href="/css/progressbar.css">
<script src="https://cdn.jsdelivr.net/npm/pace-js@1.0.2/pace.min.js"></script>

    
    
    

    
    
    


<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/iconfont.css">
</head>
<body class="is-2-column">
    <nav class="navbar navbar-main">
    <div class="container">
        <div class="navbar-brand is-flex-center">
            <a class="navbar-item navbar-logo" href="/">
            
                <img src="/images/logo.png" alt="Maven到底是什么" height="28">
            
            </a>
        </div>
        <div class="navbar-menu">
            
            <div class="navbar-start">
                
                <a class="navbar-item" href="/">主页</a>
                
                <a class="navbar-item" href="/categories">分类</a>
                
                <a class="navbar-item" href="/tags">标签</a>
                
                <a class="navbar-item" href="/archives">历史</a>
                
                <a class="navbar-item" href="/music.html">音乐</a>
                
                <a class="navbar-item" href="/about.html">关于</a>
                
            </div>
            
            <div class="navbar-end">
                
                
                <a class="navbar-item is-hidden-tablet catalogue" title="目录" href="javascript:;">
                    <i class="fas fa-list-ul"></i>
                </a>
                
                
                <a class="navbar-item search" title="搜索" href="javascript:;">
                    <i class="fas fa-search"></i>
                </a>
                
            </div>
        </div>
    </div>
</nav>
        
    <section class="section">
        <div class="container">
            <div class="columns">
                <div class="column is-8-tablet is-9-desktop is-9-widescreen has-order-2 column-main"><div class="card">
    
    <div class="card-image">
        <span class="image is-7by1">
            <img class="thumbnail" src="/gallery/thumbnails/db1.jpg" alt="Maven到底是什么">
        </span>
    </div>
    
    <div class="card-content article ">
        
        <div class="level article-meta is-size-7 is-uppercase is-mobile is-overflow-x-auto">
            <div class="level-left">
                <time class="level-item has-text-grey" datetime="2019-08-10T03:21:05.000Z">2019-08-10</time>
                
                <div class="level-item">
                <a class="has-link-grey -link" href="/categories/工具使用/">工具使用</a>&nbsp;/&nbsp;<a class="has-link-grey -link" href="/categories/工具使用/Maven/">Maven</a>
                </div>
                
                
                <span class="level-item has-text-grey">
                    
                    
                    19 分钟 读完 (大约 2859 个字)
                </span>
                
                
            </div>
        </div>
        
        <h1 class="title is-size-3 is-size-4-mobile has-text-weight-normal">
            
                Maven到底是什么
            
        </h1>
        <div class="content">
            <p>Maven 是一个项目管理工具，它最主要的两个功能就是：依赖管理和项目构建。</p>
<a id="more"></a>

<h3 id="何为依赖管理"><a href="#何为依赖管理" class="headerlink" title="何为依赖管理"></a><strong>何为依赖管理</strong></h3><p>​    在传统项目中，我们的项目如果需要第三方提供的库就必须得去官网上下载，有了Maven我们只需要在pom文件中配置对应库的坐标，Maven则会自动的去中央仓库下载对应的第三方库，这就是Maven的依赖管理。</p>
<h3 id="何为项目构建"><a href="#何为项目构建" class="headerlink" title="何为项目构建"></a><strong>何为项目构建</strong></h3><p>​    依赖管理可能比较好理解，那到底什么是项目构建呢？</p>
<p>​    在工作中，除了需要编写源代码以外，我们每天有相当一部分时间花在了项目编译、运行单元测试、生成文档、打包和部署等繁琐且不起眼的工作上，这就是构建。如果我们还去手工的完成这一部分工作，那么效率就太低了，Maven的出现使得这一整套的动作向一条流水线一样，通过一个简单的命令就能完成。</p>
<h2 id="Maven的核心思想"><a href="#Maven的核心思想" class="headerlink" title="Maven的核心思想"></a><strong>Maven的核心思想</strong></h2><p>约定优于配置（convention over configuration），Maven通过<code>超级pom</code>约定了很多通用的配置（例如：目录结构），这样做省去了我们繁琐的配置，我们只需要按照Maven的约定进行项目的创建即可。</p>
<h3 id="超级POM的位置"><a href="#超级POM的位置" class="headerlink" title="超级POM的位置"></a><strong>超级POM的位置</strong></h3><figure class="highlight shell hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-meta">$</span>&#123;Maven_Home&#125;/lib/maven-model-builder-3.3.9.jar/org/apache/maven/model/pom4.0.0.xml</span><br></pre></td></tr></table></figure>



<p>上面截取的是超级POM的一部分，它定义了Maven项目的目录结构、编译后的输出目录、资源目录等。</p>
<h3 id="Maven的目录结构"><a href="#Maven的目录结构" class="headerlink" title="Maven的目录结构"></a><strong>Maven的目录结构</strong></h3>

<h2 id="坐标和依赖"><a href="#坐标和依赖" class="headerlink" title="坐标和依赖"></a><strong>坐标和依赖</strong></h2><h3 id="何为坐标"><a href="#何为坐标" class="headerlink" title="何为坐标"></a><strong>何为坐标</strong></h3><p>在一个平面中只要给定一个直角坐标系，所有的点都能通过一个（x,y）来表示；同样的Maven也需要定义一种坐标形式来定位众多的构件。</p>
<h3 id="项目坐标定义"><a href="#项目坐标定义" class="headerlink" title="项目坐标定义"></a><strong>项目坐标定义</strong></h3><p>任何一个构件都必须明确定义自己的坐标，而坐标是通过以下元素来定义的：groupId、artifactId、version、packaging、classfier。</p>
<ul>
<li><p>groupId：定义当前Maven项目<code>隶属的实际项目</code>。首先Maven项目和实际项目并不是一一对应的，因为有些大的项目会分成很多模块，例如SpringFramework项目（实际项目）被分成spring-core、spring-beans、spring-context等模块。</p>
<figure class="highlight xml hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.springframework<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span></span><br><span class="line"><span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>spring-beans<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span></span><br><span class="line"><span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>5.1.9.RELEASE<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span></span><br><span class="line"><span class="hljs-tag">&lt;<span class="hljs-name">packaging</span>&gt;</span>jar<span class="hljs-tag">&lt;/<span class="hljs-name">packaging</span>&gt;</span></span><br></pre></td></tr></table></figure>
</li>
<li><p>artifactId：该元素定义实际项目中的一个Maven项目（模块）</p>
</li>
<li><p>version：该元素定义的Maven项目所处的版本</p>
</li>
<li><p>packaging：该元素定义Maven项目的打包方式，当不定义packaging时Maven会使用默认值jar。</p>
</li>
<li><p>classfier：该元素用于定义构件输出的一些附属构件。附属构件与主构件对应，例如主构件是nexus-indexer-2.0.0.jar的项目还可以通过使用一些插件来生成例如nexus-indexer-2.0.0-javadoc.jar、nexus-indexer-2.0.0-sources.jar这样一些附属构件。</p>
</li>
</ul>
<p>在上面五个元素中，groupId、artifactId、version是必须定义的，而packaging是可选的（默认为jar），而classfier是不能直接定义的。</p>
<h3 id="依赖的配置"><a href="#依赖的配置" class="headerlink" title="依赖的配置"></a><strong>依赖的配置</strong></h3><p>依赖管理时Maven的两大核心功能之一，它定义了一套成熟的依赖管理模式：</p>
<figure class="highlight xml hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-tag">&lt;<span class="hljs-name">dependencies</span>&gt;</span></span><br><span class="line">	<span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span></span><br><span class="line">		<span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span></span><br><span class="line">		<span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span></span><br><span class="line">		<span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span></span><br><span class="line">		<span class="hljs-tag">&lt;<span class="hljs-name">type</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">type</span>&gt;</span></span><br><span class="line">		<span class="hljs-tag">&lt;<span class="hljs-name">scope</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">scope</span>&gt;</span></span><br><span class="line">		<span class="hljs-tag">&lt;<span class="hljs-name">optional</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">optional</span>&gt;</span></span><br><span class="line">		<span class="hljs-tag">&lt;<span class="hljs-name">exclusions</span>&gt;</span></span><br><span class="line">			<span class="hljs-tag">&lt;<span class="hljs-name">exclusion</span>&gt;</span>....<span class="hljs-tag">&lt;/<span class="hljs-name">exclusion</span>&gt;</span></span><br><span class="line">			...</span><br><span class="line">		<span class="hljs-tag">&lt;/<span class="hljs-name">exclusions</span>&gt;</span></span><br><span class="line">	<span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span></span><br><span class="line">    ...</span><br><span class="line"><span class="hljs-tag">&lt;/<span class="hljs-name">dependencies</span>&gt;</span></span><br></pre></td></tr></table></figure>

<ul>
<li>groupId、artifactId、version：依赖的基本坐标，对任何一个依赖来说，基本坐标是最重要的。</li>
<li>type：依赖的类型，对应项目坐标定义中的packaging属性。</li>
<li>scope：依赖的范围。</li>
<li>optional：标记依赖是否可选</li>
<li>exclusions：用于排除传递性依赖。</li>
</ul>
<h3 id="依赖范围"><a href="#依赖范围" class="headerlink" title="依赖范围"></a><strong>依赖范围</strong></h3><p>​    Maven在编译主代码的时候会使用一套classpath；其次Maven在编译和执行测试的时候会使用另外一套classpath；最后，实际运行Maven项目的时候，又会使用一套classpath。而依赖范围就是用来控制依赖于这三种classpath（编译classpath、测试classpath、运行classpath）。</p>
<p>​    <strong>Maven有以下几种依赖范围</strong>：</p>
<ul>
<li><p><code>compile</code>：编译依赖范围，如果未指定scope属性，那么该依赖默认范围是compile。compile也是我们项目中运用最多的依赖范围。</p>
</li>
<li><p><code>test</code>：测试依赖范围，只在测试classpath中有效，在编译主代码时不能使用该此依赖。</p>
</li>
<li><p><code>provided</code>：已提供依赖范围，例如servlet-api，我们将项目部署到服务器时，服务器会自动的提供这些依赖环境，但是我们在编译时又必须使用该依赖，否则编译不了，所以就有了provided依赖范围。</p>
</li>
<li><p><code>runtime</code>：运行时依赖范围，有些依赖我们只需要在运行时加进去就可以了，例如MySQL驱动，由于MySQL驱动完全是按照java提供的规范编写，所有在Java自带的API中有对应的接口，我们面向接口编程不需要显示调用驱动中的代码，所以在代码编译时就不需要提供。</p>
</li>
<li><p><code>system</code>：系统依赖范围。该依赖与三种classpath的关系和provided依赖范围完全一致。但是使用system范围的依赖时必须通过systemPath元素显示的指定依赖文件的路径。由于此依赖不是通过Maven仓库解析的，，而且往往与本机系统弄个绑定，可能造成构件的不可移植，因此需谨慎使用。</p>
<figure class="highlight xml hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span></span><br><span class="line">	<span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>javax.sql<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span></span><br><span class="line">	<span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>jdbc-stdext<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span></span><br><span class="line">	<span class="hljs-tag">&lt;<span class="hljs-name">version</span>&gt;</span>2.0<span class="hljs-tag">&lt;/<span class="hljs-name">version</span>&gt;</span></span><br><span class="line">	<span class="hljs-tag">&lt;<span class="hljs-name">scope</span>&gt;</span>system<span class="hljs-tag">&lt;/<span class="hljs-name">scope</span>&gt;</span></span><br><span class="line">	<span class="hljs-tag">&lt;<span class="hljs-name">systemPath</span>&gt;</span>$&#123;java.home&#125;/lib/rt.jar<span class="hljs-tag">&lt;/<span class="hljs-name">systemPath</span>&gt;</span></span><br><span class="line"><span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span></span><br></pre></td></tr></table></figure>



</li>
</ul>




<h3 id="依赖的传递"><a href="#依赖的传递" class="headerlink" title="依赖的传递"></a><strong>依赖的传递</strong></h3><h4 id="何为依赖传递"><a href="#何为依赖传递" class="headerlink" title="何为依赖传递"></a><strong>何为依赖传递</strong></h4><p>Maven的依赖传递大大减轻了我们对项目依赖文件的管理难度，如果不使用Maven如果我们要在自己的项目中搭建Spring环境，那么我们就需要去下载Spring的jar包，引入到本地项目中，但是Spring仍然需要依赖其它第三方的jar包，此时我们就必须查阅相关文档手动引入Spring所依赖的环境，这个非常繁琐。</p>
<p>Maven的依赖传递机制就很好的解决了这一问题，如果你在pom文件中引入spring-core那么Maven就会将spring-core和spring-core所依赖的环境都引入到工程中。</p>
<h4 id="依赖范围影响依赖的传递"><a href="#依赖范围影响依赖的传递" class="headerlink" title="依赖范围影响依赖的传递"></a><strong>依赖范围影响依赖的传递</strong></h4><p>​    依赖范围不仅可以控制依赖于三种classpath的关系，还对传递性依赖产生影响。假设A依赖于B，B依赖于C，我们说A对于B是第一直接依赖，B对于C是第二直接依赖，A对于C是间接依赖。</p>


<p>​    下图中，最左边一列代表第一直接依赖，最上面一行代表第二直接依赖：</p>


<p>​    见上图我们可发现这样一个规律：当第二直接依赖为compile时，传递依赖与第一直接依赖一致；当第二直接依赖为test时，依赖不会得到传递；当第二直接依赖是provided时，只传递第一直接依赖为provided的依赖，且传递依赖依然为provided；当第二直接依赖是runtime时，传递依赖除compile以外与第一传递依赖一致。</p>
<p>​    <strong>表格的具体理解</strong>：</p>


<p>​    对于这张图，A-&gt;B和A-&gt;D就是第一直接依赖，B-&gt;C和D-&gt;E是第二直接依赖。第一和第二的概念是相对于现在所处的项目来说的。假如A项目使我们此时正在进行的项目，B、D都是本项目直接依赖的jar，那么C、E分别是B、D的直接依赖，那他们是否会随着B和D的引入而引入A项目呢？</p>
<p>​    根据表格得知，compile-test是无效的，也就是C根本不会被引入到A项目中；而compile-runtime是runtime也就是说E会被引入A项目，并且在A项目中E的scope是runtime。</p>
<h3 id="依赖仲裁三原则"><a href="#依赖仲裁三原则" class="headerlink" title="依赖仲裁三原则"></a><strong>依赖仲裁三原则</strong></h3><ol>
<li><strong>版本声明原则</strong></li>
</ol>
<p>​    优先按照依赖管理<code>&lt;dependencyManagement&gt;</code>元素中指定的版本声明进行仲裁，此时下面的两个原则都无效了。</p>
<ol start="2">
<li><strong>最短路径原则</strong></li>
</ol>


<p>​    在此种依赖关系下，<code>gupao-web</code>到底依赖的是1.1版本还是1.0版本的<code>gupao-common-lib</code>。</p>
<p>​    根据最短路径原则，在<code>gupao-web</code>依赖的是1.0版本的，Maven会自动过滤掉1.1版本的<code>gupao-common-lib</code></p>
<ol start="3">
<li><p><strong>最先声明原则</strong></p>


<p>若<code>最短路径原则</code>无法做出仲裁，那么就需要使用<code>最先声明原则</code>了，在这个案例中，<code>gupao-common-lib</code>到底依赖哪个版本取决于，<code>gupao-biz</code>和<code>gupao-dal</code>谁先声明。</p>
</li>
</ol>
<h3 id="依赖冲突"><a href="#依赖冲突" class="headerlink" title="依赖冲突"></a><strong>依赖冲突</strong></h3><h4 id="何为依赖冲突"><a href="#何为依赖冲突" class="headerlink" title="何为依赖冲突"></a><strong>何为依赖冲突</strong></h4><p>大多数的依赖冲突发生的原因是因为maven的传递依赖会引入很多隐式的依赖，这些依赖可能会和我们显示依赖版本不一致。</p>


<p>如图，我们显示依赖了 spring-boot1.5.9，和spring-core4.0.8（当然这种情况在正常情况下不会发生）在这种情况，根据Maven的最短依赖路径原则，会使用spring-core4.0.8,当在启动项目的时候会报错。这是因为spring-boot1.5.9运行所需要的spring-core版本是4.3.13，但是项目中编译的spring-core版本是4.0.8。</p>
<p>​    <strong>Maven冲突的实质是：不同版本的jar中会有部分API不一样，例如A依赖B的1.4版本中的某些新特性，但是系统根据<code>仲裁法则</code>选择了1.3版本的B，此时A所依赖的新特性用不了，这就导致项目无法运行。</strong></p>
<h4 id="如何解决依赖冲突"><a href="#如何解决依赖冲突" class="headerlink" title="如何解决依赖冲突"></a><strong>如何解决依赖冲突</strong></h4><p>​    冲突导致项目无法运行的原因是因为系统按照“<code>三大依赖仲裁法则</code>”留下的jar包的版本不适用于所有需求者，那么我们需要通过仲裁法则或者<exclutions>标签来解决冲突。    <strong>解决冲突的最终目的就是将我们需要的版本留下来，让系统忽略不兼容的版本。</strong></exclutions></p>
<p>​    解决依赖有两大种方法：</p>
<ol>
<li>利用<code>依赖仲裁三原则</code>选出我们需要的版本</li>
</ol>
<ul>
<li>版本声明原则：我们在<code>&lt;dependencyManagement&gt;</code>锁定版本号。</li>
<li>最短路径原则：我们直接在项目中显示引入需要的jar包版本即可。</li>
<li>优先声明原则：我们将需要的版本放在前面声明</li>
</ul>
<ol start="2">
<li>利用<code>&lt;exclution&gt;</code>标签添加排除</li>
</ol>


<p>在IDEA中就会显示servlet-api冲突，（omitted for duplicate：省略重复的）</p>
<p>​    </p>
<p>在当前这个情况中，我们以添加<exclution>进行排除</exclution></p>
<figure class="highlight xml hljs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span></span><br><span class="line">    <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>javax.servlet<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span></span><br><span class="line">    <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>servlet-api<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span></span><br><span class="line">    <span class="hljs-tag">&lt;<span class="hljs-name">scope</span>&gt;</span>provided<span class="hljs-tag">&lt;/<span class="hljs-name">scope</span>&gt;</span></span><br><span class="line"><span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span></span><br><span class="line"><span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span></span><br><span class="line">    <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>javax.servlet<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span></span><br><span class="line">    <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>jsp-api<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span></span><br><span class="line">    <span class="hljs-tag">&lt;<span class="hljs-name">scope</span>&gt;</span>provided<span class="hljs-tag">&lt;/<span class="hljs-name">scope</span>&gt;</span></span><br><span class="line">    <span class="hljs-tag">&lt;<span class="hljs-name">exclusions</span>&gt;</span></span><br><span class="line">        <span class="hljs-tag">&lt;<span class="hljs-name">exclusion</span>&gt;</span></span><br><span class="line">            <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>javax.servlet<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span></span><br><span class="line">            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>servlet-api<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span></span><br><span class="line">        <span class="hljs-tag">&lt;/<span class="hljs-name">exclusion</span>&gt;</span></span><br><span class="line">    <span class="hljs-tag">&lt;/<span class="hljs-name">exclusions</span>&gt;</span></span><br><span class="line"><span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span></span><br></pre></td></tr></table></figure>


        </div>
        
        <div class="level is-size-7 is-uppercase">
            <div class="level-start">
                <div class="level-item">
                    <span class="is-size-6 has-text-grey has-mr-7">#</span>
                    <a class="has-link-grey -link" href="/tags/Maven/">Maven</a>
                </div>
            </div>
        </div>
        
        
        
        
<div class="sharethis-inline-share-buttons"></div>
<script type="text/javascript" src="//platform-api.sharethis.com/js/sharethis.js#property=5d1b4ddd55a8b200110cdf62&amp;product=social-ab" async="async"></script>

        
    </div>
</div>



<div class="card">
    <div class="card-content">
        <h3 class="menu-label has-text-centered">喜欢这篇文章？打赏一下作者吧</h3>
        <div class="buttons is-centered">
            
                
<a class="button is-info donate">
    <span class="icon is-small">
        <i class="fab fa-alipay"></i>
    </span>
    <span>支付宝</span>
    <div class="qrcode"><img src="/images/alipay.jpg" alt="支付宝"></div>
</a>

                
                
<a class="button is-success donate">
    <span class="icon is-small">
        <i class="fab fa-weixin"></i>
    </span>
    <span>微信</span>
    <div class="qrcode"><img src="/images/wechat.png" alt="微信"></div>
</a>

                
        </div>
    </div>
</div>



<div class="card card-transparent">
    <div class="level post-navigation is-flex-wrap is-mobile">
        
        <div class="level-end">
            <a class="level level-item has-link-grey  article-nav-next" href="/article/51207.html">
                <i class="level-item fas fa-chevron-left"></i>
                <span class="level-item">一文看懂Spring事务的七种传播行为（转）</span>
            </a>
        </div>
        
        
        <div class="level-start">
            <a class="level level-item has-link-grey  article-nav-prev" href="/article/56692.html">
                <span class="level-item">Maven生命周期与插件</span>
                <i class="level-item fas fa-chevron-right"></i>
            </a>
        </div>
        
    </div>
</div>



<div class="card">
    <div class="card-content">
        <h3 class="title is-5 has-text-weight-normal">评论</h3>
        
<div id="comment-container"></div>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/gitalk@1.4.1/dist/gitalk.css">
<script src="https://cdn.jsdelivr.net/npm/gitalk@1.4.1/dist/gitalk.min.js"></script>
<script>
    var gitalk = new Gitalk({
        clientID: 'a362d7e659d5da0b4c24',
        clientSecret: 'bfd2817b484ba4d45ad14e44bbf993fa353a4f2d',
        id: '3df4c6d54d8e3c0f868360d6c733415e',
        repo: 'blog_comment',
        owner: 'tianjindong',
        admin: "tianjindong"
    })
    gitalk.render('comment-container')
</script>

    </div>
</div>
</div>
                




<div class="column is-4-tablet is-3-desktop is-3-widescreen  has-order-1 column-left ">
    
        
<div class="card widget">
    <div class="card-content">
        <nav class="level">
            <div class="level-item has-text-centered">
                <div>
                    
                        <img class="image is-128x128 has-mb-6" src="/images/avatar.png" alt="听到微笑">
                    
                    
                    <p class="is-size-4 is-block">
                        听到微笑
                    </p>
                    
                    
                    <p class="is-size-6 is-block">
                        Java Engineer
                    </p>
                    
                    
                    <p class="is-size-6 is-flex is-flex-center has-text-grey">
                        <i class="fas fa-map-marker-alt has-mr-7"></i>
                        <span>中国 上海</span>
                    </p>
                    
                </div>
            </div>
        </nav>
        <nav class="level is-mobile">
            <div class="level-item has-text-centered is-marginless">
                <div>
                    <p class="heading">
                        文章
                    </p>
                    <p class="title has-text-weight-normal">
                        54
                    </p>
                </div>
            </div>
            <div class="level-item has-text-centered is-marginless">
                <div>
                    <p class="heading">
                        分类
                    </p>
                    <p class="title has-text-weight-normal">
                        20
                    </p>
                </div>
            </div>
            <div class="level-item has-text-centered is-marginless">
                <div>
                    <p class="heading">
                        标签
                    </p>
                    <p class="title has-text-weight-normal">
                        30
                    </p>
                </div>
            </div>
        </nav>
        <div class="level">
            <a class="level-item button is-link is-rounded" href="https://github.com/tianjindong" target="_blank">
                关注我</a>
        </div>
        
        
        <div class="level is-mobile">
            
            <a class="level-item button is-white is-marginless" target="_blank" title="Github" href="https://github.com/tianjindong">
                
                <i class="iconfont-github icon-GitHub"></i>
                
            </a>
            
            <a class="level-item button is-white is-marginless" target="_blank" title="Gitee" href="https://gitee.com/tianjindong">
                
                <i class="iconfont-gitee icon-gitee"></i>
                
            </a>
            
            <a class="level-item button is-white is-marginless" target="_blank" title="CSDN" href="https://blog.csdn.net/tianjindong0804">
                
                <i class="iconfont-csdn icon-CN_csdnnet"></i>
                
            </a>
            
            <a class="level-item button is-white is-marginless" target="_blank" title="Twitter" href="https://twitter.com/HearingSmile">
                
                <i class="iconfont-twitter icon-twitter"></i>
                
            </a>
            
        </div>
        
    </div>
</div>
    
        
<div class="card widget" id="toc">
    <div class="card-content">
        <div class="menu">
            <h3 class="menu-label">
                目录
            </h3>
            <ul class="menu-list"><ul class="menu-list"><li>
        <a class="is-flex" href="#何为依赖管理">
        <span class="has-mr-6">1.1</span>
        <span>何为依赖管理</span>
        </a></li><li>
        <a class="is-flex" href="#何为项目构建">
        <span class="has-mr-6">1.2</span>
        <span>何为项目构建</span>
        </a></li></ul><li>
        <a class="is-flex" href="#Maven的核心思想">
        <span class="has-mr-6">2</span>
        <span>Maven的核心思想</span>
        </a><ul class="menu-list"><li>
        <a class="is-flex" href="#超级POM的位置">
        <span class="has-mr-6">2.1</span>
        <span>超级POM的位置</span>
        </a></li><li>
        <a class="is-flex" href="#Maven的目录结构">
        <span class="has-mr-6">2.2</span>
        <span>Maven的目录结构</span>
        </a></li></ul></li><li>
        <a class="is-flex" href="#坐标和依赖">
        <span class="has-mr-6">3</span>
        <span>坐标和依赖</span>
        </a><ul class="menu-list"><li>
        <a class="is-flex" href="#何为坐标">
        <span class="has-mr-6">3.1</span>
        <span>何为坐标</span>
        </a></li><li>
        <a class="is-flex" href="#项目坐标定义">
        <span class="has-mr-6">3.2</span>
        <span>项目坐标定义</span>
        </a></li><li>
        <a class="is-flex" href="#依赖的配置">
        <span class="has-mr-6">3.3</span>
        <span>依赖的配置</span>
        </a></li><li>
        <a class="is-flex" href="#依赖范围">
        <span class="has-mr-6">3.4</span>
        <span>依赖范围</span>
        </a></li><li>
        <a class="is-flex" href="#依赖的传递">
        <span class="has-mr-6">3.5</span>
        <span>依赖的传递</span>
        </a><ul class="menu-list"><li>
        <a class="is-flex" href="#何为依赖传递">
        <span class="has-mr-6">3.5.1</span>
        <span>何为依赖传递</span>
        </a></li><li>
        <a class="is-flex" href="#依赖范围影响依赖的传递">
        <span class="has-mr-6">3.5.2</span>
        <span>依赖范围影响依赖的传递</span>
        </a></li></ul></li><li>
        <a class="is-flex" href="#依赖仲裁三原则">
        <span class="has-mr-6">3.6</span>
        <span>依赖仲裁三原则</span>
        </a></li><li>
        <a class="is-flex" href="#依赖冲突">
        <span class="has-mr-6">3.7</span>
        <span>依赖冲突</span>
        </a><ul class="menu-list"><li>
        <a class="is-flex" href="#何为依赖冲突">
        <span class="has-mr-6">3.7.1</span>
        <span>何为依赖冲突</span>
        </a></li><li>
        <a class="is-flex" href="#如何解决依赖冲突">
        <span class="has-mr-6">3.7.2</span>
        <span>如何解决依赖冲突</span>
        </a></li></ul></li></ul></li></ul>
        </div>
    </div>
</div>

    
        
    
    
        <div class="column-right-shadow  is-sticky">
        
            
<div class="card widget">
    <div class="card-content">
        <h3 class="menu-label">
            最新文章
        </h3>
        
        <article class="media">
            
            <a href="/article/37883.html" class="media-left">
                <p class="image is-64x64">
                    <img class="thumbnail" src="http://image.bigcoder.cn/20210116215841.png" alt="DockerSwarm架构详解(转载)">
                </p>
            </a>
            
            <div class="media-content">
                <div class="content">
                    <div><time class="has-text-grey is-size-7 is-uppercase" datetime="2021-01-16T13:46:04.000Z">2021-01-16</time></div>
                    <a href="/article/37883.html" class="has-link-black-ter is-size-6">DockerSwarm架构详解(转载)</a>
                    <p class="is-size-7 is-uppercase">
                        <a class="has-link-grey -link" href="/categories/Docker/">Docker</a>
                    </p>
                </div>
            </div>
        </article>
        
        <article class="media">
            
            <a href="/article/54308.html" class="media-left">
                <p class="image is-64x64">
                    <img class="thumbnail" src="/gallery/thumbnails/h4.jpg" alt="B树和B+树与磁盘读写之间的联系">
                </p>
            </a>
            
            <div class="media-content">
                <div class="content">
                    <div><time class="has-text-grey is-size-7 is-uppercase" datetime="2019-08-24T02:20:31.000Z">2019-08-24</time></div>
                    <a href="/article/54308.html" class="has-link-black-ter is-size-6">B树和B+树与磁盘读写之间的联系</a>
                    <p class="is-size-7 is-uppercase">
                        <a class="has-link-grey -link" href="/categories/数据结构/">数据结构</a>
                    </p>
                </div>
            </div>
        </article>
        
        <article class="media">
            
            <a href="/article/21035.html" class="media-left">
                <p class="image is-64x64">
                    <img class="thumbnail" src="/gallery/thumbnails/h3.jpg" alt="什么是B+树">
                </p>
            </a>
            
            <div class="media-content">
                <div class="content">
                    <div><time class="has-text-grey is-size-7 is-uppercase" datetime="2019-08-19T10:25:05.000Z">2019-08-19</time></div>
                    <a href="/article/21035.html" class="has-link-black-ter is-size-6">什么是B+树</a>
                    <p class="is-size-7 is-uppercase">
                        <a class="has-link-grey -link" href="/categories/数据结构/">数据结构</a>
                    </p>
                </div>
            </div>
        </article>
        
        <article class="media">
            
            <a href="/article/8567.html" class="media-left">
                <p class="image is-64x64">
                    <img class="thumbnail" src="/gallery/thumbnails/f6.jpg" alt="什么是B-树">
                </p>
            </a>
            
            <div class="media-content">
                <div class="content">
                    <div><time class="has-text-grey is-size-7 is-uppercase" datetime="2019-08-19T10:24:50.000Z">2019-08-19</time></div>
                    <a href="/article/8567.html" class="has-link-black-ter is-size-6">什么是B-树</a>
                    <p class="is-size-7 is-uppercase">
                        <a class="has-link-grey -link" href="/categories/数据结构/">数据结构</a>
                    </p>
                </div>
            </div>
        </article>
        
        <article class="media">
            
            <a href="/article/62369.html" class="media-left">
                <p class="image is-64x64">
                    <img class="thumbnail" src="/gallery/thumbnails/h1.jpg" alt="什么是一致性Hash算法">
                </p>
            </a>
            
            <div class="media-content">
                <div class="content">
                    <div><time class="has-text-grey is-size-7 is-uppercase" datetime="2019-08-16T07:27:10.000Z">2019-08-16</time></div>
                    <a href="/article/62369.html" class="has-link-black-ter is-size-6">什么是一致性Hash算法</a>
                    <p class="is-size-7 is-uppercase">
                        <a class="has-link-grey -link" href="/categories/数据结构/">数据结构</a>
                    </p>
                </div>
            </div>
        </article>
        
    </div>
</div>

        
            
        
        </div>
    
</div>

                
            </div>
        </div>
    </section>
    <footer class="footer">
    <div class="container">
        <div class="level">
            <div class="level-start has-text-centered-mobile">
                <a class="footer-logo is-block has-mb-6" href="/">
                
                    <img src="/images/logo.png" alt="Maven到底是什么" height="28">
                
                </a>
                <p class="is-size-7">
                &copy; 2021 听到微笑&nbsp;
                Powered by <a href="https://hexo.io/" target="_blank">Hexo</a> & <a href="https://github.com/ppoffice/hexo-theme-icarus" target="_blank">Icarus</a>
                
                </p>
            </div>
            <div class="level-end">
            
            </div>
        </div>
    </div>
</footer>
    <script src="https://cdn.jsdelivr.net/npm/jquery@3.3.1/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/moment@2.22.2/min/moment-with-locales.min.js"></script>
<script>moment.locale("zh-CN");</script>


    
    
    
    <script src="/js/animation.js"></script>
    

    
    
    
    <script src="https://cdn.jsdelivr.net/npm/lightgallery@1.6.8/dist/js/lightgallery.min.js" defer></script>
    <script src="https://cdn.jsdelivr.net/npm/justifiedGallery@3.7.0/dist/js/jquery.justifiedGallery.min.js" defer></script>
    <script src="/js/gallery.js" defer></script>
    

    
    

<div id="outdated">
    <h6>Your browser is out-of-date!</h6>
    <p>Update your browser to view this website correctly. <a id="btnUpdateBrowser" href="http://outdatedbrowser.com/">Update
            my browser now </a></p>
    <p class="last"><a href="#" id="btnCloseUpdateBrowser" title="Close">&times;</a></p>
</div>
<script src="https://cdn.jsdelivr.net/npm/outdatedbrowser@1.1.5/outdatedbrowser/outdatedbrowser.min.js" defer></script>
<script>
    document.addEventListener("DOMContentLoaded", function () {
        outdatedBrowser({
            bgColor: '#f25648',
            color: '#ffffff',
            lowerThan: 'flex'
        });
    });
</script>


    
    
<script src="https://cdn.jsdelivr.net/npm/mathjax@2.7.5/unpacked/MathJax.js?config=TeX-MML-AM_CHTML" defer></script>
<script>
document.addEventListener('DOMContentLoaded', function () {
    MathJax.Hub.Config({
        'HTML-CSS': {
            matchFontHeight: false
        },
        SVG: {
            matchFontHeight: false
        },
        CommonHTML: {
            matchFontHeight: false
        },
        tex2jax: {
            inlineMath: [
                ['$','$'],
                ['\\(','\\)']
            ]
        }
    });
});
</script>

    
    

<a id="back-to-top" title="回到顶端" href="javascript:;">
    <i class="fas fa-chevron-up"></i>
</a>
<script src="/js/back-to-top.js" defer></script>


    
    

    
    
    
    

    
    
    
    
    
    <script src="https://cdn.jsdelivr.net/npm/clipboard@2.0.4/dist/clipboard.min.js" defer></script>
    <script src="/js/clipboard.js" defer></script>
    

    
    
    


<script src="/js/main.js" defer></script>

    
    <div class="searchbox ins-search">
    <div class="searchbox-container ins-search-container">
        <div class="searchbox-input-wrapper">
            <input type="text" class="searchbox-input ins-search-input" placeholder="想要查找什么...">
            <span class="searchbox-close ins-close ins-selectable"><i class="fa fa-times-circle"></i></span>
        </div>
        <div class="searchbox-result-wrapper ins-section-wrapper">
            <div class="ins-section-container"></div>
        </div>
    </div>
</div>
<script>
    (function (window) {
        var INSIGHT_CONFIG = {
            TRANSLATION: {
                POSTS: '文章',
                PAGES: '页面',
                CATEGORIES: '分类',
                TAGS: '标签',
                UNTITLED: '(无标题)',
            },
            CONTENT_URL: '/content.json',
        };
        window.INSIGHT_CONFIG = INSIGHT_CONFIG;
    })(window);
</script>
<script src="/js/insight.js" defer></script>
<link rel="stylesheet" href="/css/search.css">
<link rel="stylesheet" href="/css/insight.css">
    
</body>
</html>